﻿using Nemerle.Collections;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;
using Nemerle.Peg;

namespace Nemerle2.Compiler
{
  /// <summary>
  /// Базовый интерфейс описывающий общие свойства всех членов типов (в том числе и самих типов).
  /// </summary>
  public interface IMemberInfo : INamedInfo
  {
    Modifiers   : Modifiers   { get; } // enum
    MemberKind  : MemberKind  { get; } // класс, метод, свойство...

    /// <summary>Gets a value indicating whether member is abstract and must be overridden.</summary>
    IsAbstract    : bool      { get; }
    IsInternal    : bool      { get; }
    IsObsolete    : bool      { get; }
    IsPrivate     : bool      { get; }
    IsProtected   : bool      { get; }
    IsPublic      : bool      { get; }
    IsStatic      : bool      { get; }  // types are always static
    /// <summary>Type where declared this member. null if it's a top level type.</summary>
    DeclaringType : ITypeInfo { get; }


    CanAccess (source : ITypeInfo) : bool;
    CanAccess(memberNTypeInfo : ITypeInfo, currentNTypeInfo : ITypeInfo, isThisAccess : bool) : bool;
  }
}
